package com.ywd.materials.admin.utils;

import com.ywd.materials.admin.vo.MaterialsWarehouseTreePartVo;
import com.ywd.materials.admin.vo.MaterialsWarehouseTreeVo;
import org.springframework.util.CollectionUtils;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 组织树形结构工具类
 */
public class TreeWarehouseUtil {

    /**
     * 构建树形结构（优化版）
     * @param list 所有组织节点列表
     * @return 树形结构列表
     */
    public static List<MaterialsWarehouseTreeVo> buildWarehouseTree(List<MaterialsWarehouseTreeVo> list) {
        if (CollectionUtils.isEmpty(list)) {
            return Collections.emptyList();
        }
        // 使用LinkedHashMap保持插入顺序
        Map<Long, MaterialsWarehouseTreeVo> nodeMap = new LinkedHashMap<>(list.size());
        List<MaterialsWarehouseTreeVo> rootNodes = new ArrayList<>();
        // 第一次遍历：构建节点映射，识别根节点
        for (MaterialsWarehouseTreeVo node : list) {
            nodeMap.put(node.getId(), node);

            Long parentId = node.getPid();
            if (isRootNode(parentId)) {
                rootNodes.add(node);
            }
        }
        // 第二次遍历：构建父子关系
        for (MaterialsWarehouseTreeVo node : list) {
            Long parentId = node.getPid();
            if (!isRootNode(parentId)) {
                MaterialsWarehouseTreeVo parent = nodeMap.get(parentId);
                if (parent != null) {
                    if (parent.getChildren() == null) {
                        parent.setChildren(new ArrayList<>());
                    }
                    parent.getChildren().add(node);
                } else {
                    // 父节点不存在，将其作为根节点
                    rootNodes.add(node);
                }
            }
        }
        return rootNodes;
    }

    /**
     * 判断是否为根节点
     */
    private static boolean isRootNode(Long parentId) {
        return parentId == null || parentId == 0L;
    }


    /**
     * 构建树形结构（优化版）
     * @param list 所有组织节点列表
     * @return 树形结构列表
     */
    public static List<MaterialsWarehouseTreePartVo> buildWarehouseTreeOne(List<MaterialsWarehouseTreePartVo> list) {
        if (CollectionUtils.isEmpty(list)) {
            return Collections.emptyList();
        }
        // 使用LinkedHashMap保持插入顺序
        Map<Long, MaterialsWarehouseTreePartVo> nodeMap = new LinkedHashMap<>(list.size());
        List<MaterialsWarehouseTreePartVo> rootNodes = new ArrayList<>();
        // 第一次遍历：构建节点映射，识别根节点
        for (MaterialsWarehouseTreePartVo node : list) {
            nodeMap.put(node.getId(), node);

            Long parentId = node.getPid();
            if (isRootNodeOne(parentId)) {
                rootNodes.add(node);
            }
        }
        // 第二次遍历：构建父子关系
        for (MaterialsWarehouseTreePartVo node : list) {
            Long parentId = node.getPid();
            if (!isRootNodeOne(parentId)) {
                MaterialsWarehouseTreePartVo parent = nodeMap.get(parentId);
                if (parent != null) {
                    if (parent.getChildren() == null) {
                        parent.setChildren(new ArrayList<>());
                    }
                    parent.getChildren().add(node);
                } else {
                    // 父节点不存在，将其作为根节点
                    rootNodes.add(node);
                }
            }
        }
        return rootNodes;
    }

    /**
     * 判断是否为根节点
     */
    private static boolean isRootNodeOne(Long parentId) {
        return parentId == null || parentId == 0L;
    }


}
